#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

#define TASK_NUM 10

//任务
void sync_disk()
{
    printf("这是一个刷新数据的任务!\n");
}

void sync_log()
{
    printf("这是一个同步日志的任务!\n");
}

void net_send()
{
    printf("这是一个进行网络发送的任务!\n");
}

//任务预处理
typedef void (*fun_c)();
fun_c other_task[TASK_NUM] = {NULL};//函数指针数组

int LoadTask(fun_c fun)
{
  int i = 0;
  for(; i < TASK_NUM; ++i)
  {
    if(other_task[i] == NULL) break;
  }

  if(i == TASK_NUM) return -1;//任务已满
  other_task[i] = fun;
  return 0;//表示任务加载成功
}

void Init()
{
  int i = 0;
  for(; i < TASK_NUM; ++i) other_task[i] = NULL;
    
  LoadTask(sync_disk);
  LoadTask(sync_log);
  LoadTask(net_send);
}

void RunTask()
{
  int i = 0;
  for(; i < TASK_NUM; ++i)
  {
    if(other_task[i] == NULL) continue;

    other_task[i]();//执行任务
  }
}


int main()
{
  pid_t id = fork();
  
  if(id == 0)
  {
    //child
    int cnt = 5;
    while(cnt)
    {
      printf("我是子进程:%d, 我%dS后退出\n", getpid(), cnt--);
      sleep(1);
    }
    exit(1);
  }
  

  Init();
  //father
 while(1)
 {
    int status = 0;
    gid_t it = waitpid(id, &status, WNOHANG);
    if(it < 0)
    {
      printf("等待子进程失败\n");
      exit(1);
    }
    else if(it == 0)
    {
      RunTask();
      sleep(1);
      continue;
    }
    else{
      if(WIFEXITED(status))
      {
          printf("wait sucess! exit code:%d\n", WEXITSTATUS(status));
      }
      else
      {
          printf("wait sucess! exit signal:%d\n", status & 0x7F);
      }
      //printf("我是父进程:%d,等待子进程:%d成功! 退出码:%d, 退出信号:%d.\n", getpid(), it, (status>>8)&0XFF, status&0X7F);
      break;
    }
 }
  return 0;
}
